const fetchConfig={
  baseURL:'http://39.104.21.39:8899',
  headers:{
    'Content-Type': 'application/json',
    'domain':'www.xinshenghe999.com'
  },
}

/**
 * 请求拦截
 * @param {*} options 
 * @returns 
 * 
 * 配置参数说明：
 * 
 * method：请求方法。
   query：使用ufo将查询搜索参数添加到URL。
   params：query的别名。
   body：请求体 - 自动转换为字符串（如果传递的是对象）。
   headers：请求头。
   baseURL：请求的基本URL。
 * 
 * key：一个唯一的键，用于确保数据获取可以在请求之间正确去重。如果未提供，将根据使用useAsyncData的静态代码位置生成。
   server：是否在服务器上获取数据（默认为true）。
   lazy：是否在加载路由后解析异步函数，而不是阻止客户端导航（默认为false）。
   immediate：如果设置为false，将阻止立即发出请求（默认为true）。
   default：一个工厂函数，用于设置data的默认值，在异步函数解析之前使用 - 与lazy: true或immediate: false选项一起使用。
   transform：在解析后可以用于更改handler函数结果的函数。
   pick：仅从handler函数结果中选择指定的键。
   watch：监听一组响应式源，并在它们发生变化时自动刷新获取的结果。默认情况下，会监听fetch选项和URL。您可以通过使用watch: false来完全忽略响应式源。结合immediate: false，可以实现完全手动的useFetch。
   deep：以深层ref对象的形式返回数据（默认为true）。可以将其设置为false，以在浅层ref对象中返回数据，如果您的数据不需要深层响应，则可以提高性能。
 * 
 * 响应参数说明：
 * data：传入的异步函数的结果。
   pending：一个布尔值，指示数据是否仍在获取中。
   refresh/execute：一个可以用于刷新handler函数返回的数据的函数。
   error：如果数据获取失败，则为错误对象。
   status：表示数据请求的状态的字符串（"idle"、"pending"、"success"、"error"）。
 * 
 * 
 */
function useGetFetchOptions(options={}){
  //?? : 前面没有值，则走后面
  options.baseURL=options.baseURL ?? fetchConfig.baseURL
  options.headers=options.headers ?? fetchConfig.headers
  options.method=options.method ?? 'GET'

  options.server=options.server ?? true
  options.lazy=options.lazy ?? false
  options.immediate=options.immediate ?? true
  options.default=options.default ?? null
  options.pick=options.pick ?? null
  options.deep=options.deep ?? true

  options.key=options.key ?? 'useHttp'
  options.body=options.body ?? null
  options.transform=options.transform ?? null
  
  options.watch=options.watch ?? null
  
  // initialCache:后期的nuxt3取消了这个配置
  // options.initialCache=options.initialCache ?? false

  return options
}

/**
 * 响应拦截器
 * @param {*} key 每个请求的独立标识 
 * @param {*} request 请求路径
 * @param {*} options 请求内容，包含请求头
 */
export async function useHttp(key,path,options={}) {
  options=useGetFetchOptions(options)
  options.key=key
  let res = await useFetch(path,{
    ...options,
    transform:(res)=>{
      if(res.success){
        return res.responseData
      }else{
        return res
      }
      
    }
  })

  //TODO: 错误处理
  return res
}

//请求：GET
export function httpGet(key,url,options={}){
  options.method="GET"
  return useHttp(key,url,options)
}

//请求：POST
export function httpPost(key,url,options={}){
  options.method="POST"
  return useHttp(key,url,options)
}